//-------------------------include C Header File start------------------------//
#include "delay.h"

//-------------------------include C Header File end--------------------------//
//-------------------------defined variable start-----------------------------//
static u8  fac_us=0;							//us延时倍乘数
//-------------------------defined variable end-------------------------------//
/*******************************************************************************
** 函数名称: delay_init
** 功能描述: 延时初始化
** 参数说明: SYSCLK: 系统时钟，如果系统时钟是72M，就输入72
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-04
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Delay_init(u8 SYSCLK)
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
	fac_us=SYSCLK;					
}
/*******************************************************************************
** 函数名称: delay_us
** 功能描述: 微秒的API
** 参数说明: nus: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-04
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Delay_us(u32 nus)
{		
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值,倒数至零，更新重装载值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)
            {
                tcnt+=(told-tnow);	//这里注意一下SYSTICK是一个递减的计数器就可以了.
            }
			else
            {                
                tcnt+=(reload-tnow+told);	
            }                
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};
}
/*******************************************************************************
** 函数名称: delay_ms
** 功能描述: 毫秒的API
** 参数说明: nms: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-04
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Delay_ms(u16 nms)
{
	u32 i;
	for(i=0;i<nms;i++) Delay_us(1000);
}
/*******************************************************************************
** 函数名称: delay_s
** 功能描述: 秒的API
** 参数说明: ns: [输入/出] 
** 返回说明: None
** 创建人员: 林业翔
** 创建日期: 2019-06-04
**------------------------------------------------------------------------------
** 修改人员:
** 修改日期:
** 修改描述:
**------------------------------------------------------------------------------
********************************************************************************/
void Delay_s(u16 ns)
{
    u32 i;
    for(i=0;i<ns;i++) Delay_ms(1000);
}
/*********************************END OF FILE***********************************/





